package top.csy8888.ch05.service;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.stereotype.Service;
import top.csy8888.ch05.config.RabbitConfig;

import java.io.IOException;
import java.util.Map;

/**
 * @author CSY
 * @date 2025 - 10 - 11
 */
//@Service
//@Slf4j
public class OrderConsumerService {
    /**
     * 使用@RabbitListener直接进行监听，
     * queues属性指定要监听的队列名称
     * @param message
     */
    /*@RabbitListener(queues = RabbitConfig.QUEUE_NAME)
    public void receive(String message) {
        log.info("处理消息: {}", message);
    }*/

    /**
     * 方式二：
     * 可以使用@RabbitListener注解来创建交换机、队列并绑定
     * 注意：当使用bindings属性时，不允许再指定queues属性
     *
     * 如果是手动签收的模式，可以传入一个Channel参数，
     * 这个是rabbitmq客户端原生的API对象，使用这个对象
     * 来完成ACK的应答
     *
     * mao参数用于获取消息头信息，需要结合Headers注解使用
     * @param message
     */
   /* @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = RabbitConfig.QUEUE_NAME,durable = "false"),
            exchange = @Exchange(name = RabbitConfig.EXCHANGE_NAME,type = ExchangeTypes.DIRECT),
            key = RabbitConfig.ROUTING_KEY
    ))
    public void receive(String message,
                        Channel channel,
                        @Headers Map<String,Object> headers) throws IOException {
        log.info("处理消息: {}", message);
        //当手动签收时，需要给rabbitmq回馈一条消息，
        // 告诉rabbitmq当前的消息处理完毕，
        // 需要先从消息头中获取一个签收的标签
        Long tag = (Long)headers.get(AmqpHeaders.DELIVERY_TAG);
        //执行手动签收
        //参数二：用于设置是否批量签收
        channel.basicAck(tag,false);
    }*/
}
